/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package app.cliente;

import app.modelo.Libro;
import app.negocio.GestionLibreria;
import app.negocio.LibroNoEncontradoException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author Johann Pando
 */
public class MiJFrame extends javax.swing.JFrame {

    private DefaultTableModel model;
    private static final String CADENAVACIA = "";
    //Constante para la longitud max de los campos en el formulario.
    private static final int MAXLONGNUM = 8;
    private static final int MAXLONGVARMED = 50;
    private static final int MAXLONGVARBAJ = 20;
    private static final int MAXLONGVARALT = 200;
    private static final int MAXLONGDOUBLE = 6;

    /**
     * Creates new form MiJFrame
     */
    public MiJFrame() {
        initComponents();
        cargarTabla();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        buttonGroup = new javax.swing.ButtonGroup();
        jSeparator1 = new javax.swing.JSeparator();
        jPanel1 = new javax.swing.JPanel();
        txtBuscarLibroGral = new javax.swing.JTextField();
        jLabel1 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        btnBuscar = new javax.swing.JButton();
        radBtnTitulo = new javax.swing.JRadioButton();
        radBtnISBN = new javax.swing.JRadioButton();
        radBtnTodos = new javax.swing.JRadioButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();
        btnAltaLibro = new javax.swing.JButton();
        btnModificarPrecio = new javax.swing.JButton();
        btnEliminarLibro = new javax.swing.JButton();
        jLabel2 = new javax.swing.JLabel();
        txtTituloLibro = new javax.swing.JTextField();
        jLabel4 = new javax.swing.JLabel();
        txtAutorLibro = new javax.swing.JTextField();
        jLabel5 = new javax.swing.JLabel();
        txtPublicacionLibro = new javax.swing.JTextField();
        jLabel6 = new javax.swing.JLabel();
        jLabel7 = new javax.swing.JLabel();
        txtPrecioLibro = new javax.swing.JTextField();
        jLabel8 = new javax.swing.JLabel();
        txtEditorialLibro = new javax.swing.JTextField();
        btnGuardarLibro = new javax.swing.JButton();
        btnCancelar = new javax.swing.JButton();
        jLabel9 = new javax.swing.JLabel();
        txtISBN = new javax.swing.JTextField();
        btnVer = new javax.swing.JButton();
        jScrollPane2 = new javax.swing.JScrollPane();
        txtDescripcionLibro = new javax.swing.JTextArea();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Gestión Libros - Johann Pando");
        setResizable(false);

        txtBuscarLibroGral.setEnabled(false);

        jLabel1.setText("Ingrese texto a buscar:");

        jLabel3.setText("Tipo de búsqueda");

        btnBuscar.setText("Buscar");
        btnBuscar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnBuscarActionPerformed(evt);
            }
        });

        buttonGroup.add(radBtnTitulo);
        radBtnTitulo.setText("Título del libro");
        radBtnTitulo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                radBtnTituloActionPerformed(evt);
            }
        });

        buttonGroup.add(radBtnISBN);
        radBtnISBN.setText("ISBN");
        radBtnISBN.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                radBtnISBNActionPerformed(evt);
            }
        });

        buttonGroup.add(radBtnTodos);
        radBtnTodos.setSelected(true);
        radBtnTodos.setText("Listar Todos");
        radBtnTodos.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                radBtnTodosActionPerformed(evt);
            }
        });

        jTable1.setAutoCreateRowSorter(true);
        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {

            }
        ));
        jTable1.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
        jScrollPane1.setViewportView(jTable1);

        btnAltaLibro.setText("Alta Libro");
        btnAltaLibro.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAltaLibroActionPerformed(evt);
            }
        });

        btnModificarPrecio.setText("Modificar Precio Libro");
        btnModificarPrecio.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnModificarPrecioActionPerformed(evt);
            }
        });

        btnEliminarLibro.setText("Eliminar Libro");
        btnEliminarLibro.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnEliminarLibroActionPerformed(evt);
            }
        });

        jLabel2.setText("Título del libro(*)");
        jLabel2.setToolTipText("");

        txtTituloLibro.setEnabled(false);
        txtTituloLibro.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                txtTituloLibroKeyPressed(evt);
            }
        });

        jLabel4.setText("Autor(*)");

        txtAutorLibro.setEnabled(false);
        txtAutorLibro.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                txtAutorLibroKeyPressed(evt);
            }
        });

        jLabel5.setText("Descripción");

        txtPublicacionLibro.setEnabled(false);
        txtPublicacionLibro.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                txtPublicacionLibroKeyPressed(evt);
            }
        });

        jLabel6.setText("Publicación(*)");

        jLabel7.setText("Precio(*)");

        txtPrecioLibro.setEnabled(false);
        txtPrecioLibro.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtPrecioLibroActionPerformed(evt);
            }
        });
        txtPrecioLibro.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                txtPrecioLibroKeyPressed(evt);
            }
        });

        jLabel8.setText("Editorial(*)");

        txtEditorialLibro.setEnabled(false);
        txtEditorialLibro.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                txtEditorialLibroKeyPressed(evt);
            }
        });

        btnGuardarLibro.setText("Guardar Libro");
        btnGuardarLibro.setEnabled(false);
        btnGuardarLibro.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnGuardarLibroActionPerformed(evt);
            }
        });

        btnCancelar.setText("Cancelar");
        btnCancelar.setEnabled(false);
        btnCancelar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnCancelarActionPerformed(evt);
            }
        });

        jLabel9.setText("ISBN(*)");

        txtISBN.setEnabled(false);
        txtISBN.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                txtISBNKeyPressed(evt);
            }
        });

        btnVer.setText("Ver Libro");
        btnVer.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnVerActionPerformed(evt);
            }
        });

        txtDescripcionLibro.setColumns(20);
        txtDescripcionLibro.setLineWrap(true);
        txtDescripcionLibro.setRows(5);
        txtDescripcionLibro.setEnabled(false);
        txtDescripcionLibro.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                txtDescripcionLibroKeyPressed(evt);
            }
        });
        jScrollPane2.setViewportView(txtDescripcionLibro);

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(btnAltaLibro, javax.swing.GroupLayout.PREFERRED_SIZE, 180, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel9)
                            .addComponent(jLabel2)
                            .addComponent(jLabel4)
                            .addComponent(jLabel6)
                            .addComponent(jLabel8)
                            .addComponent(jLabel5)
                            .addComponent(jLabel7))
                        .addGap(61, 61, 61)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(jPanel1Layout.createSequentialGroup()
                                .addComponent(btnModificarPrecio, javax.swing.GroupLayout.PREFERRED_SIZE, 180, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGap(38, 38, 38)
                                .addComponent(btnEliminarLibro, javax.swing.GroupLayout.PREFERRED_SIZE, 180, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 44, Short.MAX_VALUE)
                                .addComponent(btnVer, javax.swing.GroupLayout.PREFERRED_SIZE, 158, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(jPanel1Layout.createSequentialGroup()
                                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                    .addComponent(txtTituloLibro, javax.swing.GroupLayout.DEFAULT_SIZE, 427, Short.MAX_VALUE)
                                    .addComponent(txtISBN)
                                    .addComponent(txtPrecioLibro, javax.swing.GroupLayout.PREFERRED_SIZE, 180, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addComponent(txtAutorLibro)
                                    .addComponent(txtPublicacionLibro, javax.swing.GroupLayout.PREFERRED_SIZE, 180, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addComponent(txtEditorialLibro)
                                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
                                        .addComponent(btnGuardarLibro, javax.swing.GroupLayout.PREFERRED_SIZE, 195, javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                        .addComponent(btnCancelar, javax.swing.GroupLayout.PREFERRED_SIZE, 182, javax.swing.GroupLayout.PREFERRED_SIZE))
                                    .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 387, javax.swing.GroupLayout.PREFERRED_SIZE))
                                .addGap(0, 0, Short.MAX_VALUE))))
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                            .addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel1Layout.createSequentialGroup()
                                .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 184, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGap(18, 18, 18)
                                .addComponent(txtBuscarLibroGral, javax.swing.GroupLayout.PREFERRED_SIZE, 302, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel1Layout.createSequentialGroup()
                                .addComponent(jLabel3)
                                .addGap(117, 117, 117)
                                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(btnBuscar)
                                    .addGroup(jPanel1Layout.createSequentialGroup()
                                        .addComponent(radBtnTodos)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                        .addComponent(radBtnTitulo)
                                        .addGap(46, 46, 46)
                                        .addComponent(radBtnISBN)))))
                        .addGap(0, 0, Short.MAX_VALUE)))
                .addContainerGap())
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGap(25, 25, 25)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(txtBuscarLibroGral, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(24, 24, 24)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel3)
                    .addComponent(radBtnTitulo)
                    .addComponent(radBtnISBN)
                    .addComponent(radBtnTodos))
                .addGap(18, 18, 18)
                .addComponent(btnBuscar)
                .addGap(18, 18, 18)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 143, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnAltaLibro)
                    .addComponent(btnModificarPrecio)
                    .addComponent(btnEliminarLibro)
                    .addComponent(btnVer))
                .addGap(36, 36, 36)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtTituloLibro, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtAutorLibro, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel4))
                .addGap(18, 18, 18)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtPublicacionLibro, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel6))
                .addGap(18, 18, 18)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtEditorialLibro, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel8))
                .addGap(18, 18, 18)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtPrecioLibro, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel7))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(txtISBN, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel9))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGap(30, 30, 30)
                        .addComponent(jLabel5)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 22, Short.MAX_VALUE)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnGuardarLibro)
                    .addComponent(btnCancelar))
                .addContainerGap())
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    /**
     * * M&eacute;todo que se ejecuta cunado se pulsa en el bot&oacute;n
     * Buscar.
     *
     * @param evt
     */
    private void btnBuscarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnBuscarActionPerformed
        // TODO add your handling code here:
        if (radBtnTodos.isSelected()) {
            consultarTodos();
        } else if (radBtnTitulo.isSelected()) {
            if (cajaBusquedaNoVacia()) {
                consultarTitulo();
            } else {
                JOptionPane.showMessageDialog(this, "Inserte un título");
            }
        } else if (radBtnISBN.isSelected()) {
            if (cajaBusquedaNoVacia()) {
                consultarISBN();
            } else {
                JOptionPane.showMessageDialog(this, "Inserte un ISBN");
            }
        }
    }//GEN-LAST:event_btnBuscarActionPerformed

    private void radBtnTituloActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_radBtnTituloActionPerformed
        // TODO add your handling code here:
        txtBuscarLibroGral.setEnabled(true);
    }//GEN-LAST:event_radBtnTituloActionPerformed

    private void radBtnTodosActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_radBtnTodosActionPerformed
        // TODO add your handling code here:
        txtBuscarLibroGral.setEnabled(false);
        txtBuscarLibroGral.setText(CADENAVACIA);
    }//GEN-LAST:event_radBtnTodosActionPerformed

    private void radBtnISBNActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_radBtnISBNActionPerformed
        // TODO add your handling code here:
        txtBuscarLibroGral.setEnabled(true);
    }//GEN-LAST:event_radBtnISBNActionPerformed

    private void txtPrecioLibroActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txtPrecioLibroActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_txtPrecioLibroActionPerformed

    /**
     * * M&eacute;todo que se ejecuta cunado se pulsa en el bot&oacute;n Alta.
     *
     * @param evt
     */
    private void btnAltaLibroActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAltaLibroActionPerformed
        // TODO add your handling code here:
        limpiarDatosLibro();
        habilitarObjetosAlta();
        habilitarEdicionText();
    }//GEN-LAST:event_btnAltaLibroActionPerformed

    /**
     * * M&eacute;todo que se ejecuta cunado se pulsa en el bot&oacute;n
     * Cancelar.
     *
     * @param evt
     */
    private void btnCancelarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCancelarActionPerformed
        // TODO add your handling code here:
        deshabilitarObjetosAlta();
        limpiarDatosLibro();
        habilitarEdicionText();
    }//GEN-LAST:event_btnCancelarActionPerformed

    /**
     * * M&eacute;todo que se ejecuta cunado se pulsa en el bot&oacute;n
     * Guardar.
     *
     * @param evt
     */
    private void btnGuardarLibroActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnGuardarLibroActionPerformed
        // TODO add your handling code here:
        if (compruebaDatosObligatorios()) {
            if (btnModificarPrecio.isEnabled()) {
                modificarLibro();
            } else {
                altaLibro();
            }
        } else {
            JOptionPane.showMessageDialog(this, "No ha introducido todos los datos obligatorios.");
        }
        habilitarEdicionText();
    }//GEN-LAST:event_btnGuardarLibroActionPerformed

    /**
     * * M&eacute;todo que se ejecuta cunado se pulsa en el bot&oacute;n
     * Modificar Precio.
     */
    private void btnModificarPrecioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnModificarPrecioActionPerformed
        // TODO add your handling code here:
        int filaSeleccionada = jTable1.getSelectedRow();
        if (filaSeleccionada < 0) {
            // no se puede eliminar
            JOptionPane.showMessageDialog(this, "Tabla vacia o no ha seleccionado un libro.");
        } else {
            //Recuperamos de la fila actual 'filaSeleccionada' la columna isbn (4)
            String isbn = (String) model.getValueAt(filaSeleccionada, 4);
            cargarDatosLibros(isbn, true);
        }
    }//GEN-LAST:event_btnModificarPrecioActionPerformed

    /**
     * * M&eacute;todo que se ejecuta cunado se pulsa en el bot&oacute;n
     * Eliminar.
     *
     * @param evt
     */
    private void btnEliminarLibroActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnEliminarLibroActionPerformed
        // TODO add your handling code here:
        int filaSeleccionada = jTable1.getSelectedRow();
        if (filaSeleccionada < 0) {
            // no se puede eliminar
            JOptionPane.showMessageDialog(this, "Tabla vacia o no ha seleccionado un libro.");
        } else {
            // la eliminamos del modelo:
            //model.removeRow(filaSeleccionada);
            int resultado = JOptionPane.showConfirmDialog(this, "¿Realmente desea eliminar el libro seleccionado?", "Seleccione una Opción", JOptionPane.YES_NO_OPTION);
            if (resultado == JOptionPane.YES_OPTION) {
                Integer idLibro = (Integer) model.getValueAt(filaSeleccionada, 0);
                eliminarLibro(idLibro);
            }
        }
    }//GEN-LAST:event_btnEliminarLibroActionPerformed

    /**
     * M&eacute;todo que se ejecuta cunado se pulsa en el bot&oacute;n Ver.
     *
     * @param evt
     */
    private void btnVerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnVerActionPerformed
        // TODO add your handling code here:
        int filaSeleccionada = jTable1.getSelectedRow();
        if (filaSeleccionada < 0) {
            // no se puede eliminar
            JOptionPane.showMessageDialog(this, "Tabla vacia o no ha seleccionado un libro.");
        } else {
            //Recuperamos de la fila actual 'filaSeleccionada' la columna isbn (4)
            String isbn = (String) model.getValueAt(filaSeleccionada, 4);
            cargarDatosLibros(isbn, false);
        }
    }//GEN-LAST:event_btnVerActionPerformed

    /**
     * Evitamos que se añadan más campos de los que están reservados en BD.
     *
     * @param evt
     */
    private void txtTituloLibroKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txtTituloLibroKeyPressed
        // TODO add your handling code here:
        if (txtTituloLibro.getText().length() == MAXLONGVARMED) {
            txtTituloLibro.setEditable(false);
        }
        if (evt.getKeyCode() == evt.VK_BACK_SPACE) {
            if (txtTituloLibro.getText().length() == MAXLONGVARMED) {
                txtTituloLibro.setEditable(true);
            }
        }
    }//GEN-LAST:event_txtTituloLibroKeyPressed

    /**
     * Evitamos que se añadan más campos de los que están reservados en BD.
     *
     * @param evt
     */
    private void txtAutorLibroKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txtAutorLibroKeyPressed
        // TODO add your handling code here:
        if (txtAutorLibro.getText().length() == MAXLONGVARMED) {
            txtAutorLibro.setEditable(false);
        }
        if (evt.getKeyCode() == evt.VK_BACK_SPACE) {
            if (txtAutorLibro.getText().length() == MAXLONGVARMED) {
                txtAutorLibro.setEditable(true);
            }
        }
    }//GEN-LAST:event_txtAutorLibroKeyPressed

    /**
     * Evitamos que se añadan más campos de los que están reservados en BD.
     *
     * @param evt
     */
    private void txtEditorialLibroKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txtEditorialLibroKeyPressed
        // TODO add your handling code here:
        if (txtEditorialLibro.getText().length() == MAXLONGVARMED) {
            txtEditorialLibro.setEditable(false);
        }
        if (evt.getKeyCode() == evt.VK_BACK_SPACE) {
            if (txtEditorialLibro.getText().length() == MAXLONGVARMED) {
                txtEditorialLibro.setEditable(true);
            }
        }
    }//GEN-LAST:event_txtEditorialLibroKeyPressed

    /**
     * Evitamos que se añadan más campos de los que están reservados en BD.
     *
     * @param evt
     */
    private void txtPublicacionLibroKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txtPublicacionLibroKeyPressed
        // TODO add your handling code here:
        if (txtPublicacionLibro.getText().length() == MAXLONGNUM) {
            txtPublicacionLibro.setEditable(false);
        }
        if (evt.getKeyCode() == evt.VK_BACK_SPACE) {
            if (txtPublicacionLibro.getText().length() == MAXLONGNUM) {
                txtPublicacionLibro.setEditable(true);
            }
        }
    }//GEN-LAST:event_txtPublicacionLibroKeyPressed

    /**
     * Evitamos que se añadan más campos de los que están reservados en BD.
     *
     * @param evt
     */
    private void txtISBNKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txtISBNKeyPressed
        // TODO add your handling code here:
        if (txtISBN.getText().length() == MAXLONGVARBAJ) {
            txtISBN.setEditable(false);
        }
        if (evt.getKeyCode() == evt.VK_BACK_SPACE) {
            if (txtISBN.getText().length() == MAXLONGVARBAJ) {
                txtISBN.setEditable(true);
            }
        }
    }//GEN-LAST:event_txtISBNKeyPressed

    /**
     * Evitamos que se añadan más campos de los que están reservados en BD.
     *
     * @param evt
     */
    private void txtDescripcionLibroKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txtDescripcionLibroKeyPressed
        // TODO add your handling code here:
        if (txtDescripcionLibro.getText().length() == MAXLONGVARALT) {
            txtDescripcionLibro.setEditable(false);
        }
        if (evt.getKeyCode() == evt.VK_BACK_SPACE) {
            if (txtDescripcionLibro.getText().length() == MAXLONGVARALT) {
                txtDescripcionLibro.setEditable(true);
            }
        }
    }//GEN-LAST:event_txtDescripcionLibroKeyPressed

    /**
     * Evitamos que se añadan más campos de los que están reservados en BD.
     *
     * @param evt
     */
    private void txtPrecioLibroKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txtPrecioLibroKeyPressed
        // TODO add your handling code here:
        if (txtPrecioLibro.getText().length() == MAXLONGDOUBLE) {
            txtPrecioLibro.setEditable(false);
        }
        if (evt.getKeyCode() == evt.VK_BACK_SPACE) {
            if (txtPrecioLibro.getText().length() == MAXLONGDOUBLE) {
                txtPrecioLibro.setEditable(true);
            }
        }
    }//GEN-LAST:event_txtPrecioLibroKeyPressed

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(MiJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(MiJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(MiJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(MiJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                //new MiJFrame().setVisible(true);
                MiJFrame miJFrame = new MiJFrame();
                //Posicionamos la pantalla en el centro.
                miJFrame.setLocationRelativeTo(null);
                miJFrame.setDefaultCloseOperation(miJFrame.EXIT_ON_CLOSE);
                miJFrame.setVisible(true);
            }

        });
    }

    /**
     * Cargamos la tabla cuando ejecutamos la apliaci&oacute;n
     */
    private void cargarTabla() {
        String data[][] = {};
        String col[] = {"Id", "Título", "Autor", "Editorial", "ISBN",
            "Publicación", "Precio", "Descripción"};
        model = new DefaultTableModel(data, col);
        jTable1.setModel(model);

        //Establecemos el tamaño de las columnas
        jTable1.getColumnModel().getColumn(0).setPreferredWidth(50);
        jTable1.getColumnModel().getColumn(1).setPreferredWidth(100);
        jTable1.getColumnModel().getColumn(2).setPreferredWidth(100);
        jTable1.getColumnModel().getColumn(3).setPreferredWidth(100);
        jTable1.getColumnModel().getColumn(4).setPreferredWidth(50);
        jTable1.getColumnModel().getColumn(5).setPreferredWidth(100);
        jTable1.getColumnModel().getColumn(6).setPreferredWidth(50);
        jTable1.getColumnModel().getColumn(7).setPreferredWidth(250);
    }

    /**
     * M6acute;todo que consulta todos los libros en BD.
     */
    private void consultarTodos() {
        GestionLibreria gestionLibreria = new GestionLibreria();
        List<Libro> libros = gestionLibreria.consultarTodos();
        if (libros != null && !libros.isEmpty()) {
            pintarLibrosEnTabla(libros);
        } else if (libros != null && libros.isEmpty()) {
            limpiarTabla();
            JOptionPane.showMessageDialog(null, "Actualmente no hay existencias de libros.");
        }

    }

    /**
     * M&eacute;todo que consulta el t&iacute;tulo de un libro.
     */
    private void consultarTitulo() {
        try {
            GestionLibreria gestionLibreria = new GestionLibreria();
            List<Libro> libros = gestionLibreria.consultarTitulo(txtBuscarLibroGral.getText());
            pintarLibrosEnTabla(libros);
        } catch (LibroNoEncontradoException ex) {
            Logger.getLogger(MiJFrame.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(this, ex.getMessage());
        }
    }

    /**
     * M6acute;todo que consulta un libro a partir de su ISBN.
     */
    private void consultarISBN() {
        try {
            GestionLibreria gestionLibreria = new GestionLibreria();
            Libro libro = gestionLibreria.consultarISBN(txtBuscarLibroGral.getText());
            List<Libro> libros = new ArrayList<Libro>();
            libros.add(libro);
            pintarLibrosEnTabla(libros);
        } catch (LibroNoEncontradoException ex) {
            Logger.getLogger(MiJFrame.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(this, ex.getMessage());
        }
    }

    /**
     * M6eacute;todo que actualiza el precio de un libro.</br>
     * Devuelve un mensaje si ha ido todo correctamente, de lo contrario muestra
     * un mensaje de informaci&oacute;n indicando un error.
     */
    private void modificarLibro() {
        GestionLibreria gestionLibreria = new GestionLibreria();
        try {
            double precioNuevo = Double.valueOf(txtPrecioLibro.getText());
            if (gestionLibreria.modificarPrecio(txtISBN.getText(), precioNuevo)) {
                JOptionPane.showMessageDialog(this, "El libro se ha actualizado correctamente");
                deshabilitarObjetosAlta();
                limpiarDatosLibro();
                consultarTodos();
                btnModificarPrecio.setEnabled(true);
            } else {
                JOptionPane.showMessageDialog(this, "ERROR: No se ha podido actualizar el libro");
            }
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(this, "Formato incorrecto en el precio.");
        }

    }

    /**
     * M6eacute;todo que guarda en BD un libro.</br>
     * Devuelve un mensaje si ha ido todo correctamente, de lo contrario muestra
     * un mensaje de informaci&oacute;n indicando un error.
     */
    private void altaLibro() {
        GestionLibreria gestionLibreria = new GestionLibreria();
        Libro libro = new Libro();
        libro.setAutor(txtAutorLibro.getText());
        libro.setDescripcion(txtDescripcionLibro.getText());
        libro.setEditorial(txtEditorialLibro.getText());
        libro.setIsbn(txtISBN.getText());
        try {
            libro.setPrecio(Double.parseDouble(txtPrecioLibro.getText()));
            libro.setPublicacion(Integer.parseInt(txtPublicacionLibro.getText()));
            libro.setTitulo(txtTituloLibro.getText());
            if (gestionLibreria.altaLibro(libro)) {
                JOptionPane.showMessageDialog(this, "El libro se ha insertado correctamente.");
                limpiarDatosLibro();
                deshabilitarObjetosAlta();
                //Después de dar de alta, listamos los libros para que aparezca
                //en la tabla.
                consultarTodos();
            } else {
                JOptionPane.showMessageDialog(this, "ERROR: El libro no ha sido insertado.");
            }
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(this, "Formato incorrecto en el precio/publicación.");
        }
    }

    /**
     * M&eacute;do que recibe una lista de libros y los va anadiedno a la tabla.
     *
     * @param libros
     */
    private void pintarLibrosEnTabla(List<Libro> libros) {
        if (libros != null) {
            limpiarTabla();
            int cantLibros = libros.size();
            for (int i = 0; i < cantLibros; i++) {
                anadirLibrosTabla(i, libros.get(i));
            }
        }
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnAltaLibro;
    private javax.swing.JButton btnBuscar;
    private javax.swing.JButton btnCancelar;
    private javax.swing.JButton btnEliminarLibro;
    private javax.swing.JButton btnGuardarLibro;
    private javax.swing.JButton btnModificarPrecio;
    private javax.swing.JButton btnVer;
    private javax.swing.ButtonGroup buttonGroup;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JLabel jLabel9;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JSeparator jSeparator1;
    private javax.swing.JTable jTable1;
    private javax.swing.JRadioButton radBtnISBN;
    private javax.swing.JRadioButton radBtnTitulo;
    private javax.swing.JRadioButton radBtnTodos;
    private javax.swing.JTextField txtAutorLibro;
    private javax.swing.JTextField txtBuscarLibroGral;
    private javax.swing.JTextArea txtDescripcionLibro;
    private javax.swing.JTextField txtEditorialLibro;
    private javax.swing.JTextField txtISBN;
    private javax.swing.JTextField txtPrecioLibro;
    private javax.swing.JTextField txtPublicacionLibro;
    private javax.swing.JTextField txtTituloLibro;
    // End of variables declaration//GEN-END:variables

    /**
     * Anade un fila al libro en tiempo de ejecuci&oacute;n
     *
     * @param i
     * @param libro
     */
    private void anadirLibrosTabla(int i, Libro libro) {
        //Añade una fila en tiempo de ejecución.        
        model.insertRow(i, new Object[]{});
        model.setValueAt(libro.getID(), i, 0);
        model.setValueAt(libro.getTitulo(), i, 1);
        model.setValueAt(libro.getAutor(), i, 2);
        model.setValueAt(libro.getEditorial(), i, 3);
        model.setValueAt(libro.getIsbn(), i, 4);
        model.setValueAt(libro.getPublicacion(), i, 5);
        model.setValueAt(libro.getPrecio(), i, 6);
        model.setValueAt(libro.getDescripcion(), i, 7);

    }

    /**
     * M&eacute;todo que limpia la tabla.
     */
    private void limpiarTabla() {
        final int filas = model.getRowCount();
        if (filas > 0) {
            for (int i = filas - 1; i >= 0; i--) {
                model.removeRow(i);
            }
        }
    }

    /**
     * Comprueba que en la caja de b&uacute;squeda se inserte texto.
     *
     * @return
     */
    private boolean cajaBusquedaNoVacia() {
        return txtBuscarLibroGral.getText() != null
                && !txtBuscarLibroGral.getText().isEmpty();
    }

    /**
     * Habilita objetos del formulario
     */
    private void habilitarObjetosAlta() {

        btnGuardarLibro.setEnabled(true);
        btnCancelar.setEnabled(true);
        txtAutorLibro.setEnabled(true);
        txtDescripcionLibro.setEnabled(true);
        txtEditorialLibro.setEnabled(true);
        txtPrecioLibro.setEnabled(true);
        txtPrecioLibro.setEnabled(true);
        txtPublicacionLibro.setEnabled(true);
        txtTituloLibro.setEnabled(true);
        txtISBN.setEnabled(true);
        //Y deshabilitamos algunos objetos...
        btnBuscar.setEnabled(false);
        btnEliminarLibro.setEnabled(false);
        btnModificarPrecio.setEnabled(false);
        btnVer.setEnabled(false);
    }

    /**
     * Habilita objetos del formulario.
     */
    private void deshabilitarObjetosAlta() {
        btnGuardarLibro.setEnabled(false);
        btnCancelar.setEnabled(false);
        txtAutorLibro.setEnabled(false);
        txtDescripcionLibro.setEnabled(false);
        txtEditorialLibro.setEnabled(false);
        txtPrecioLibro.setEnabled(false);
        txtPrecioLibro.setEnabled(false);
        txtPublicacionLibro.setEnabled(false);
        txtTituloLibro.setEnabled(false);
        txtISBN.setEnabled(false);
        //Habilito el botón de modificar.
        btnModificarPrecio.setEnabled(true);
        btnBuscar.setEnabled(true);
        btnEliminarLibro.setEnabled(true);
        btnVer.setEnabled(true);
        btnAltaLibro.setEnabled(true);
    }

    /**
     * M&eacute;todo que limpia las cajas de texto.
     */
    private void limpiarDatosLibro() {

        txtAutorLibro.setText(CADENAVACIA);
        txtDescripcionLibro.setText(CADENAVACIA);
        txtEditorialLibro.setText(CADENAVACIA);
        txtPrecioLibro.setText(CADENAVACIA);
        txtPrecioLibro.setText(CADENAVACIA);
        txtPublicacionLibro.setText(CADENAVACIA);
        txtTituloLibro.setText(CADENAVACIA);
        txtISBN.setText(CADENAVACIA);
    }

    /**
     * Comprueba los datos obligatorios:
     * <li>Titulo</li>
     * <li>Autor</li>
     * <li>Editorial</li>
     * <li>ISBN</li>
     * <li>Publicación</li>
     * <li>Precio</li>
     *
     * @return
     */
    private boolean compruebaDatosObligatorios() {
        boolean ok = false;
        if (txtTituloLibro.getText() != null
                && !txtTituloLibro.getText().isEmpty()
                && txtAutorLibro.getText() != null
                && !txtAutorLibro.getText().isEmpty()
                && txtEditorialLibro.getText() != null
                && !txtEditorialLibro.getText().isEmpty()
                && txtISBN.getText() != null
                && !txtISBN.getText().isEmpty()
                && txtPublicacionLibro.getText() != null
                && !txtPublicacionLibro.getText().isEmpty()
                && txtPrecioLibro.getText() != null
                && !txtPrecioLibro.getText().isEmpty()) {
            ok = true;
        }
        return ok;
    }

    /**
     * M&eacute;todo que elimina un libro a partir de su identificador.</br>
     * Devuelve un mensaje si el libro ha sido eliminado o de lo contrario
     * informa que no se ha podido eliminar.
     *
     * @param idLibro
     */
    private void eliminarLibro(Integer idLibro) {
        GestionLibreria gestionLibreria = new GestionLibreria();
        if (gestionLibreria.eliminarLibro(idLibro)) {
            JOptionPane.showMessageDialog(this, "El libro se ha eliminado correctamente.");
            consultarTodos();
        } else {
            JOptionPane.showMessageDialog(this, "ERROR: El libro no se ha podido eliminar.");
        }
    }

    /**
     * M&eacute;todo privado que realiza la llamada a modificar el libro.
     *
     * @param isbn
     */
    private void cargarDatosLibros(String isbn, boolean modificarPrecio) {
        try {
            GestionLibreria gestionLibreria = new GestionLibreria();
            Libro libro = gestionLibreria.consultarISBN(isbn);
            txtAutorLibro.setText(libro.getAutor());
            txtDescripcionLibro.setText(libro.getDescripcion());
            txtEditorialLibro.setText(libro.getEditorial());
            txtISBN.setText(libro.getIsbn());
            txtPrecioLibro.setText(String.valueOf(libro.getPrecio()));
            txtPublicacionLibro.setText(String.valueOf(libro.getPublicacion()));
            txtTituloLibro.setText(libro.getTitulo());
            if (modificarPrecio) {
                txtPrecioLibro.setEnabled(true);
                btnGuardarLibro.setEnabled(true);
                btnCancelar.setEnabled(true);
                btnAltaLibro.setEnabled(false);
                btnBuscar.setEnabled(false);
                btnEliminarLibro.setEnabled(false);
                btnVer.setEnabled(false);
            }

        } catch (LibroNoEncontradoException ex) {
            Logger.getLogger(MiJFrame.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(this, "No se han podido cargar los datos, inténtelo de nuevo más tarde.");
        }
    }

    /**
     * Habilitsa los textos que se han podido deshabilitar al controlar el max
     * de cada campo.
     */
    private void habilitarEdicionText() {
        txtTituloLibro.setEditable(true);
        txtAutorLibro.setEditable(true);
        txtEditorialLibro.setEditable(true);
        txtISBN.setEditable(true);
        txtPublicacionLibro.setEditable(true);
        txtPrecioLibro.setEditable(true);
        txtDescripcionLibro.setEditable(true);
    }
}
